package cn.centec.mall.util;

import cn.centec.core.constant.RequestMethod;
import cn.centec.core.entity.Result;
import cn.centec.mall.entity.*;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 采购中心AIP工具 - 请求处理器 - 商城业务
 *
 * @author 延晓磊
 * @since 2022年09月15日
 */
public abstract class Centec6MallRequestHandler {

    /**
     * 发起请求
     *
     * @param method
     * @param param
     * @return
     *
     * @author 延晓磊
     * @since 2022年11月03日
     */
    public abstract Result request(String method, Object param);

    /**
     * 查询商品渠道
     *
     * @return
     *
     * @author 延晓磊
     * @since 2023年04月10日
     */
    public Map<String,String> mapChannel(){
        return this.request(RequestMethod.Mall.Request.CHANNEL_MAP, null).restJson().entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, o -> o.getValue().toString()));
    }

    /**
     * 查询商品分类列表
     *
     * @param param
     *
     * @author 延晓磊
     * @since 2022年11月03日
     */
    public Result listCat(StandardCatListParam param) {
       return this.request(RequestMethod.Mall.Request.CAT_LIST, param);
    }

    /**
     * 查询商品列表
     *
     * @param param
     *
     * @author 延晓磊
     * @since 2022年11月03日
     */
    public Result listItem(StandardItemListParam param) {
        return this.request(RequestMethod.Mall.Request.ITEM_LIST, param);
    }

    /**
     * 查询商品列表
     *
     * @param ids
     *
     * @author 延晓磊
     * @since 2022年11月03日
     * @return
     */
    public List<StandardItemListResult> listItem(List<String> ids) {
        StandardItemListParam param = new StandardItemListParam();
        param.setResult("2");
        param.setIds(ids);
        return this.request(RequestMethod.Mall.Request.ITEM_LIST, param).restList(StandardItemListResult.class);
    }

    /**
     * 查询商品建议
     *
     * @param name
     *
     * @author 延晓磊
     * @since 2022年11月03日
     * @return
     */
    public Result listItem(String name) {
        StandardItemListParam param = new StandardItemListParam();
        param.setResult("1");
        param.setName(name);
        return this.request(RequestMethod.Mall.Request.ITEM_LIST, param);
    }

    /**
     * 查询商品详情
     *
     * @param id
     *
     * @author 延晓磊
     * @since 2022年11月03日
     */
    public Result infoItem(String id) {
        return this.request(RequestMethod.Mall.Request.ITEM_INFO, id);
    }

    /**
     * 提交订单
     *
     * @param param
     * @return
     *
     * @author 延晓磊
     * @since 2023年04月10日
     */
    public StandardOrderSubmitResult submitOrder(StandardOrderSubmitParam param){
        return this.request(RequestMethod.Mall.Request.ORDER_SUBMIT, param).rest(StandardOrderSubmitResult.class);
    }

    /**
     * 取消订单
     *
     * @param id
     * @return {200:成功，*:取消失败}
     *
     * @author 延晓磊
     * @since 2023年04月11日
     */
    public Result cancelOrder(String id){
        return this.request(RequestMethod.Mall.Request.ORDER_CANCEL, id);
    }

    /**
     * 确认订单
     *
     * @param id
     * @return {200:成功，*:确认失败}
     *
     * @author 延晓磊
     * @since 2023年04月11日
     */
    public Result confirmOrder(String id){
        return this.request(RequestMethod.Mall.Request.ORDER_CONFIRM, id);
    }

    /**
     * 签收订单
     *
     * @param id
     * @return {200:成功，*:签收失败}
     *
     * @author 延晓磊
     * @since 2023年04月11日
     */
    public Result receiveOrder(String id){
        return this.request(RequestMethod.Mall.Request.ORDER_RECEIVE, id);
    }

    /**
     * 查询订单物流
     *
     * @param id    包裹ID
     * @return [物流节点]
     *
     * @author 延晓磊
     * @since 2023年04月11日
     */
    public List<StandardOrderLogisticsListResult> listOrderLogistics(Long id){
        return this.request(RequestMethod.Mall.Request.ORDER_LOGISTICS_LIST, id).restList(StandardOrderLogisticsListResult.class);
    }

    /**
     * 申请售后
     *
     * @param param
     * @return 售后单号
     *
     * @author 延晓磊
     * @since 2023年04月21日
     */
    public String submitIssue(StandardIssueSubmitParam param){
        return this.request(RequestMethod.Mall.Request.ISSUE_SUBMIT, param).restStr();
    }
}
